iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0
自我挑戰組

《轉職學習日記:JavaScript × Node.js × TypeScript × Docker × AWS ECS》系列 第 24

Day24 - 持續成長學習藍圖 - TypeScript(Prisma / TypeORM 基礎)

  • 分享至 

  • xImage
  •  

今天要進一步讓專案可以「真的」操作資料庫。
我們會學到兩個重要工具之一:PrismaTypeORM

這兩個都是 ORM(Object Relational Mapping),
能讓我們用 TypeScript 操作資料庫,像操作物件一樣簡單。


1️⃣ 什麼是 ORM?

傳統我們會這樣寫 SQL:

SELECT * FROM todos WHERE done = false;

但在 ORM 裡,我們可以這樣寫:

const todos = await prisma.todo.findMany({
  where: { done: false }
});

ORM 會自動幫我們產生 SQL,送到資料庫執行。
對 TypeScript 專案來說,它還能提供 型別提示


2️⃣ 選擇 Prisma 還是 TypeORM?

兩者都能用,但我這階段選 Prisma,原因是:

  • 文件清楚、直覺易懂
  • 跟 TypeScript 整合非常好
  • 開發工具 Prisma Studio 超方便

3️⃣ 安裝 Prisma

在專案裡執行:

npm install prisma --save-dev
npx prisma init --datasource-provider sqlite

這會建立:

prisma/
 └── schema.prisma

以及 .env

DATABASE_URL="file:./dev.db"

我們先用 SQLite 當本地練習資料庫,不用額外安裝。


4️⃣ 定義資料模型

打開 prisma/schema.prisma,修改成這樣:

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model Todo {
  id      Int      @id @default(autoincrement())
  task    String
  done    Boolean  @default(false)
  note    String?
  createdAt DateTime @default(now())
}

這就等於定義了一個 todos 表格。


5️⃣ 建立資料庫與 Prisma Client

npx prisma migrate dev --name init

這行會:

  1. 建立 SQLite 資料庫
  2. 產生 Prisma Client(可直接在程式中使用)

接著:

npx prisma generate

6️⃣ 實作 Express API

src/index.ts

import express from "express";
import { PrismaClient } from "@prisma/client";

const app = express();
const prisma = new PrismaClient();
app.use(express.json());

app.get("/todos", async (req, res) => {
  const todos = await prisma.todo.findMany();
  res.json(todos);
});

app.post("/todos", async (req, res) => {
  const { task, note } = req.body;
  const todo = await prisma.todo.create({
    data: { task, note }
  });
  res.status(201).json(todo);
});

app.put("/todos/:id", async (req, res) => {
  const id = Number(req.params.id);
  const { task, done, note } = req.body;
  const todo = await prisma.todo.update({
    where: { id },
    data: { task, done, note }
  });
  res.json(todo);
});

app.delete("/todos/:id", async (req, res) => {
  const id = Number(req.params.id);
  await prisma.todo.delete({ where: { id } });
  res.json({ message: "Todo 已刪除" });
});

app.listen(3000, () => console.log("🚀 Prisma API running on http://localhost:3000"));

7️⃣ 測試 API

新增 Todo:

curl -X POST http://localhost:3000/todos \
  -H "Content-Type: application/json" \
  -d '{"task":"Day 24 Prisma 練習","note":"學習 ORM"}'

查詢所有 Todo:

curl http://localhost:3000/todos

8️⃣ Bonus:Prisma Studio

Prisma 有一個很好用的 GUI 工具:

npx prisma studio

打開後會出現漂亮的管理介面:http://localhost:5555
可以直接新增、修改、刪除資料,就像輕量版的資料庫後台。


🎯 學習心得 / 今日收穫

今天是我第一次用 ORM 操作資料庫,感覺真的像魔法一樣 ✨

  • 不用再手寫 SQL,就能 CRUD
  • Prisma 自動幫我生成 TypeScript 型別提示
  • Prisma Studio 超直覺,開發測試更快

以前的 API 寫起來很「原始」,今天開始我真的在寫「有資料庫的後端」。


上一篇
Day23 - 持續成長學習藍圖 - TypeScript(DTO 與 class-validator)
系列文
《轉職學習日記:JavaScript × Node.js × TypeScript × Docker × AWS ECS》24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言